filterlistmodel: Look at type of change
authorBenjamin Otte <otte@redhat.com>
Tue, 30 Jun 2020 02:18:59 +0000 (04:18 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 6 Jul 2020 01:42:43 +0000 (03:42 +0200)
This way we can avoid refiltering most of an already filtered list when
the change becomes more strict.

gtk/gtkfilterlistmodel.c

index 9ef3545e856b3a2034f561d310b4fa0751681bfc..3f8aedb0b30c77347c16df2e5cd7b897dc4ef7be 100644 (file)
@@ -476,7 +476,7 @@ gtk_filter_list_model_refilter (GtkFilterListModel *self,
 
     case GTK_FILTER_MATCH_SOME:
       {
-        GtkBitset *old;
+        GtkBitset *old, *pending;
       
         if (self->matches == NULL)
           {
@@ -489,9 +489,27 @@ gtk_filter_list_model_refilter (GtkFilterListModel *self,
           {
             old = self->matches;
           }
-        self->matches = gtk_bitset_new_empty ();
         self->strictness = new_strictness;
-        gtk_filter_list_model_start_filtering (self, gtk_bitset_new_range (0, g_list_model_get_n_items (self->model)));
+        switch (change)
+          {
+          default:
+            g_assert_not_reached ();
+            G_GNUC_FALLTHROUGH;
+          case GTK_FILTER_CHANGE_DIFFERENT:
+            self->matches = gtk_bitset_new_empty ();
+            pending = gtk_bitset_new_range (0, g_list_model_get_n_items (self->model));
+            break;
+          case GTK_FILTER_CHANGE_LESS_STRICT:
+            self->matches = gtk_bitset_copy (old);
+            pending = gtk_bitset_new_range (0, g_list_model_get_n_items (self->model));
+            gtk_bitset_subtract (pending, self->matches);
+            break;
+          case GTK_FILTER_CHANGE_MORE_STRICT:
+            self->matches = gtk_bitset_new_empty ();
+            pending = gtk_bitset_copy (old);
+            break;
+          }
+        gtk_filter_list_model_start_filtering (self, pending);
 
         gtk_filter_list_model_emit_items_changed_for_changes (self, old);
       }